Aula 2 - Conhecendo seus Dados

Escola de Métodos em Ciência Política

Frederico Bertholini

Vetores

O que são vetores?

  • Vetores são combinações de valores em uma estrutura unidimensional
  • Ou seja, podem ser combinações de números, valores lógicos, nomes e várias outras possibilidades
  • Por exemplo, combinação de valores pares: 2,4,6,8
  • Ou a combinações de nomes começando por P: Pedro, Paula, Pietro, Paloma
  • Combinação de valores lógico: TRUE, FALSE, TRUE, TRUE

Criação de vetores

  • Para criar vetores é importante combinar valores
  • A função necessária para a criação de vetores é a função c(), c de combine ou concatenate
c(2,4,6,8)
[1] 2 4 6 8
c("Pedro","Paula","Pietro","Paloma")
[1] "Pedro"  "Paula"  "Pietro" "Paloma"
c(TRUE,FALSE,TRUE,FALSE)
[1]  TRUE FALSE  TRUE FALSE

Etiquetas para vetores

  • Assim como fizemos com os valores, atribuímos também etiquetas aos vetores
  • Dessa maneira, podemos trabalhar com as sequências ao longo do script, assim como dar razão ou justificativa aos valores combinados
n.pares <- c(2,4,6,8)

nomes.com.p <- 
c("Pedro","Paula","Pietro","Paloma") 

valores.log <- c(TRUE,FALSE,TRUE,FALSE)

Classes dos vetores

  • Os vetores também possuem classes
  • Essas categorias determinam as operações possíveis dentro de um vetor
  • Para obter a informação sobre a classe de um vetor, utilizamos a função class()
class(n.pares)
[1] "numeric"
class(nomes.com.p)
[1] "character"
class(valores.log)
[1] "logical"

Comprimento de vetores

  • Os vetores podem ser medidos em relação ao seu comprimento
  • O seu comprimento define a extensão do vetor, assim como quantos elementos estão presentes dentro da combinação de valores
  • O comprimento pode ser medido pela função length()
length(n.pares)
[1] 4
length(nomes.com.p)
[1] 4
length(valores.log)
[1] 4

Somatório de vetores

  • Para vetores númerico podemos somar os valores de um vetor
  • A função se chama sum() que corresponde ao \(\sum\)
sum(n.pares)
[1] 20
  • Em vetores com valores lógicos, com TRUE e FALSE, o sum soma o número de T que temos dentro de um vetor
sum(valores.log)
[1] 2

Somatório de vetores lógicos

  • A função sum() pode se tornar ainda um contador de um teste
  • Por exemplo, queremos saber quantos nomes são iguais ao de Pedro no vetor ‘nomes.com.p’
teste1 <- nomes.com.p == "Pedro"

sum(teste1)
[1] 1
teste1
[1]  TRUE FALSE FALSE FALSE

Seleção de elementos

  • Queremos selecionar no vetor nomes.com.p o segundo elemento que é Paula
  • Vejamos, primeiro, como se compõe o vetor de caracteres nomes.com.p e a lógica do posicionamento dentro do vetor
nomes.com.p
[1] "Pedro"  "Paula"  "Pietro" "Paloma"

Usando %in% na Seleção de elementos

  • Vamos testar se Paula se inclui dentro do vetor sem termos que ver no console
  • As vezes, vetores são maiores do que temos como exemplo
  • Para o teste lógico, utilizamos o operador %in%, que retorna TRUE, caso o valor esteja incluso no vetor
"Paula" %in% nomes.com.p
[1] TRUE

Regras de Seleção de elementos

  • Algumas operações se restrigem a determinados elementos ou a um conjunto deles incluso dentro de um vetor
  • Para realizar tais procedimentos precisamos saber escolher elementos
  • Para isso, utilizaremos o operador ‘[]’ depois de apontar o vetor
  • Mais especificamente: Vetor; []; Posição ou regra;

Alternativas de Seleção 1

  • Para escolhar Paula, portanto, vamos definir como a segunda posição dentro do vetor
nomes.com.p[2]
[1] "Paula"
  • O posicionamento dos nomes ao longo do vetor determina como seleciona-lo individualmente
  • Porém, podemos selecionar através do valor
nomes.com.p[nomes.com.p == "Paula"]
[1] "Paula"

Alternativas de Seleção 2

  • Selecionamos também o último valor do vetor nomes.com.p
  • Sabemos que o vetor possui 4 valores utilizando a função length()
length(nomes.com.p)
[1] 4

Alternativas de Seleção 3

  • Assim o último valor é igual a 4
  • Para selecionarmos o último valor, ou definimos como a posição 4 ou apenas o length() do vetor
nomes.com.p[4]
[1] "Paloma"
nomes.com.p[length(nomes.com.p)]
[1] "Paloma"

Seleção de elementos

  • Para seleção de elementos através de regras, podemos utilizar o vetor númerico de n.pares
n.pares  <- c(2,4,6,8)

n.pares
[1] 2 4 6 8
  • O objetivo aqui é selecionar os elementos maiores que 5, que é a mediana do vetor
median(n.pares)
[1] 5

Seleção de elementos

  • Selecionamos, assim, os elementos acima da mediana do vetor n.pares, que são os valores 6 e 8
n.pares[n.pares > 5]
[1] 6 8
  • Ou ainda podemos definir o valor 5 como o valor da mediana
  • O resultado é o mesmo, porém, deixa claro ao leitor do seu script que se trata dos valores acima da mediana do vetor n.pares
n.pares[n.pares > median(n.pares)]
[1] 6 8

Operações matemáticas

Operações com vetores

  • Em vetores numéricos, podemos fazer operações matemáticas a partir do seu posicionamento
  • Vamos calcular o alcance do vetor “n.pares”
#ultimo elemento 
n.pares[length(n.pares)]
[1] 8
#primeiro elemento
n.pares[1]
[1] 2
  • Subtraindo esses dois elementos, temos o alcance do vetor
n.pares[length(n.pares)] - n.pares[1]
[1] 6

Operações com vetores

  • Ainda em vetores numéricos, vamos calcular vetores com regras
  • Selecionamos elementos maiores que 5
n.pares[n.pares >= 5]
[1] 6 8
  • Queremos duplicar os valores inclusos dentro da condição
n.pares[n.pares >= 5] * 2
[1] 12 16
  • Por fim, operacionar um conjunto com um elemento
n.pares[n.pares >= 5] * n.pares[1]
[1] 12 16

Conjuntos

  • Utilizamos a teoria de conjuntos no R com a função de manipular e identificar elementos comuns ou diferente entre vetores
  • Já temos o vetor “n.pares” e vamos criar um vetor com números naturais
n.naturais <- c(0,1,2,3,4,5,6,7,8,9)
n.naturais
 [1] 0 1 2 3 4 5 6 7 8 9
  • Se perguntarmos por valores que não estão no vetor “n.naturais”, o resultado será conjunto vazio
n.naturais[n.naturais == 10]
numeric(0)

Conjuntos

  • Outro ponto importante é saber se os elementos estão contidos dentro de outro vetor
  • A pergunta a se fazer é: os elementos do vetor “n.partidos” está contido no vetor “n.naturais”
  • No R, contidos é igual a %in%
n.pares %in% n.naturais
[1] TRUE TRUE TRUE TRUE

Conjuntos

  • Isto é, o vetor “n.pares” está contido no vetor “n.naturais” e é um subconjunto
  • Outra maneira é utilizando a função is.element()
is.element(n.pares,n.naturais)
[1] TRUE TRUE TRUE TRUE

Conjuntos

  • Para encontrar os valores exclusivos de um conjunto, vamos utilizar a escrita da seleção de elementos
  • Podemos incluir a notação de “!”, que quer dizer diferente
  • Portanto, selecionamos os valores que estão contido no conjunto dos naturais, porém não no conjunto dos valores pares
n.naturais[!is.element(n.naturais,n.pares)]
[1] 0 1 3 5 7 9

Conjuntos

  • Por fim, vamos testar se um valor está presente em um desses vetores
  • Testaremos os valores 1, 11 e 21
1 %in% c(n.naturais,n.pares)
[1] TRUE
11 %in% c(n.naturais,n.pares)
[1] FALSE
21 %in% c(n.naturais,n.pares)
[1] FALSE
  • Assim, não temos os valores 11 e 21 em nenhum dos vetores, entendidos como conjuntos

data.frame

data.frame

  • Um data.frame é o mesmo que uma tabela do SQL ou uma planilha Excel

  • seus dados provavelmente serão importados para um objeto data.frame

  • data.frame’s são listas especiais em que todos os elementos possuem o mesmo comprimento.

  • Cada elemento dessa lista pode ser pensado como uma coluna da tabela - ou como uma variável. Uso do ‘$’

  • Seu comprimento representa o número de linhas - ou seja, de observações

Estrutura de dados - data.frame

data.frame de perto

  • Como data.frames’s são listas, suas colunas podem ser de classes diferentes. Essa é a grande diferença entre data.frame’s e matrizes.

Funções úteis:

head() # Mostra as primeiras 6 linhas.
tail() # Mostra as últimas 6 linhas.
dim() # Número de linhas e de colunas.
names() # Os nomes das colunas (variáveis).
str() # Estrutura do data.frame. Mostra, entre outras coisas, as >classes de cada coluna.
cbind() # Acopla duas tabelas lado a lado.
rbind() # Empilha duas tabelas.

Pacotes

O que são pacotes

  • O R possui diversas funções já instaladas dentro da sua programação
  • Exemplos são sum(), length(), class(), c()
  • Outras, porém, devem ser instaladas para que possam ser utilizadas pelos usuários
  • A maneira com a qual instalamos novas funções, não definidas anteriormente no software, é através de pacotes
  • Pacotes concentram diversas funções para diversas demandas
    Importação de dados;
    Organização de banco de dados;
    Análises estatísticas específicas;
    Gráficos diferenciados;

O que são pacotes

  • A instalação de qualquer pacote pode ser feita por dentro do R
  • Para isso, porém, é preciso primeiro conexão com a internet, já que o R busca o novo pacote no repositório de pacotes
  • A função para instalar pacote, portanto, é install.packages()
  • O nome da nova função deve vir, primeiramente entre parenteses
  • Podemos começar instalando o pacote para importação de bases de dados: foreign
install.packages("foreign")
  • Após alguns segundos, e algumas mensagens no console, a instalação será efetivada

Ativar pacotes

  • Cada pacote, inclusive o foreign, tem uma documentação disponível na internet
  • Nessa documentação estão disponíveis as funções que o pacote possui, além do nome do seu criador
  • As função não ficam disponíveis assim que o pacote termina a instalação
  • Para ativar as funções do pacote, é preciso utilizar a função library()
library(foreign)
  • Repare, que uma vez instalado, o nome do pacote não precisa mais estar entre aspas

Ativar pacotes

  • Portanto, para começarmos o procedimento de instalação do pacote, seguimos os passos a seguir:
    Caso não esteja instalado, instalar o pacote através da função install.packages();
    Para ativar o pacote, utilizar a função library() sem as aspas no nome do pacote instalado
install.packages("foreign")

library(foreign)
  • Uma vez instalado o pacote, não é preciso instalar mais a não ser que você reinstale o R

Importação de dados

Passo a passo

  • A importação é uma das tarefas que demandam mais atenção no R
  • É preciso ter um conhecimento prévio de como sua base externa está constituída
  • Outra informação importante é a extensão do arquivo da base
  • Primeiramente, a informação que deve ser dada ao software é onde está a base - diretório de trabalho
  • A função necessária é setwd() que define o diretório da sua seção no R
  • Dentro da função, iremos inserir o local do arquivo
    Em caso de Windows, inverta as barras ou duplique;
    Não se esqueça das aspas;
setwd("/Volumes/Macintosh HD/MQCP_IPOL_2020/Slides/aula 03") # mmudando meu direto

Passo a passo

  • Esse diretório definido significa que as bases e os gráficos produzidos serão enviados para essa pasta
  • Finalmente, vamos importar as bases de dados
  • Primeiro, vamos importar a base de extensão txt com o nome baserm
  • Não é preciso de pacote para esse procedimento
lines <- readLines("dados/baserm.txt")

baserm <- read.table(text = lines, sep = '\t')
  • Repare que definimos a base dentro das aspas e com a extensão
  • Na segunda linha, o primeiro argumento é o texto, o segundo argumento trata de como os dados estão separados, geralmente txt vem separado assim

Passo a passo

  • No pacote foreign, a forma mais genérica de importação da base é o read.table()
  • Entretanto, o pacote apresenta uma série de especialidades, a depender da extensão em questão
  • Para CSV, vimos que tem a read.csv(). Já para dta, base de origem do stata, temos a função read.dta()
  • O pacote foreign não possui a extensão xlsx e xls, extensão muito encontrada e comum entre as bases de dados disponíveis
  • Para isso, vamos instalar um novo pacote readxl
install.packages("readxl")
  • Esse pacote disponibiliza as funções read_xls() e read_xlsx()

Passo a passo

  • Vamos ativar as funções disponíveis no pacote readxl com a função library()
library(readxl)
  • Vamos importar a base controle_cgu_municípios.xlsx
cgu <- 
read_xlsx("dados/controle_cgu_municípios.xlsx")
  • Repare que acessamos apenas a primeira página da base
  • Para acessarmos a segunda páginas, utilizamos o argumento sheet=2
cgu <- 
read_xlsx("dados/controle_cgu_municípios.xlsx", 
sheet = 2)
  • Alguns sinais de alerta surgem, porém não se trata de erro

Importação por pacote

  • Por fim, podemos importar dados através de pacotes
  • Após ativar o pacote “ElectionsBR”, a função legend_fed() fica disponível para a importação
  • Como toda a função, ou quase todas, possui argumentos importantes:
    • ‘year =’ se refere ao ano de extração
    • ‘uf =’ se refere à UF

Importação

  • Vamos começar importando dados de coalizões pré-eleitorais (coligações) do DF em 2018, nos retornando um objeto em ‘tbl_df’ e data frame
library(electionsBR)
leg_df_2018 <- legend_fed(year = 2018,uf="DF")

  |                                                                            
  |                                                                      |   0%
  |                                                                            
  |==                                                                    |   3%
  |                                                                            
  |=====                                                                 |   7%
  |                                                                            
  |========                                                              |  11%
  |                                                                            
  |==========                                                            |  15%
  |                                                                            
  |===========                                                           |  16%
  |                                                                            
  |=================                                                     |  24%
  |                                                                            
  |=====================                                                 |  31%
  |                                                                            
  |==========================                                            |  37%
  |                                                                            
  |============================                                          |  40%
  |                                                                            
  |===================================                                   |  50%
  |                                                                            
  |=====================================                                 |  54%
  |                                                                            
  |========================================                              |  57%
  |                                                                            
  |=============================================                         |  64%
  |                                                                            
  |=================================================                     |  71%
  |                                                                            
  |======================================================                |  77%
  |                                                                            
  |==================================================================    |  94%
  |                                                                            
  |====================================================================  |  97%
  |                                                                            
  |======================================================================| 100%
  - Provavelmente, demorará alguns segundos, até minutos, para a importação
  - Além disso, essa forma **demanda acesso à internet**

Visualizando a base

  • Primeira coisa importante de se informar é a classe desses objetos
  • Temos 3 objetos: baserm, cgu e leg_df_2018
class(baserm)
[1] "data.frame"
class(cgu)
[1] "tbl_df"     "tbl"        "data.frame"
class(leg_df_2018)
[1] "tbl_df"     "tbl"        "data.frame"

Visualizando a base

  • Uma visão completa da base é o comando View()
  • Entretanto, cuidado, dependendo do tamanho da base, podemos travar o software
View(leg_df_2018)
  • Repare no V maiúsculo, lembre-se que o R é bastante sensível na sua linguagem
  • O View() abre uma nova aba com a base no formato de grade
  • Podemos, assim, visualizar a base de dados na forma mais intuitiva

Visualizando a base

  • Porém, para bases grandes, sabemos que é grande demais para sua visualização ser feita através do View()
  • Algumas funções podem nos ajudar nessa tarefa
  • A primeira é o dim, que as dimensões da base
dim(leg_df_2018)
[1] 251  23
  • O primeiro valor sempre retrata o número de linhas, ou observações, enquanto o segundo valor apresenta o número de colunas, ou variáveis
  • As funções ncol() e length() também fazem isso

Visualizando a base

  • Outra função importante na visualização de bases de dados é a lista de nomes
  • A função names() descreve as variáveis presentes na base
  • Isso facilita no momento de selecionar as variáveis que entrarão na análise de vocês
names(leg_df_2018)
 [1] "DT_GERACAO"              "HH_GERACAO"             
 [3] "ANO_ELEICAO"             "CD_TIPO_ELEICAO"        
 [5] "NM_TIPO_ELEICAO"         "NR_TURNO"               
 [7] "CD_ELEICAO"              "DS_ELEICAO"             
 [9] "DT_ELEICAO"              "SG_UF"                  
[11] "SG_UE"                   "NM_UE"                  
[13] "CD_CARGO"                "DS_CARGO"               
[15] "TP_AGREMIACAO"           "NR_PARTIDO"             
[17] "SG_PARTIDO"              "NM_PARTIDO"             
[19] "SQ_COLIGACAO"            "NM_COLIGACAO"           
[21] "DS_COMPOSICAO_COLIGACAO" "CD_SITUACAO_LEGENDA"    
[23] "DS_SITUACAO"            

Visualizando a base - str()

  • Outra função possível é o str()
  • Essa função apresenta o nome das variáveis, a classe de cada uma delas e os primeiros valores
str(leg_df_2018)
tibble [251 × 23] (S3: tbl_df/tbl/data.frame)
 $ DT_GERACAO             : chr [1:251] "03/03/2024" "03/03/2024" "03/03/2024" "03/03/2024" ...
 $ HH_GERACAO             : 'hms' num [1:251] 11:01:19 11:01:19 11:01:19 11:01:19 ...
  ..- attr(*, "units")= chr "secs"
 $ ANO_ELEICAO            : num [1:251] 2018 2018 2018 2018 2018 ...
 $ CD_TIPO_ELEICAO        : num [1:251] 2 2 2 2 2 2 2 2 2 2 ...
 $ NM_TIPO_ELEICAO        : chr [1:251] "ELEIÇÃO ORDINÁRIA" "ELEIÇÃO ORDINÁRIA" "ELEIÇÃO ORDINÁRIA" "ELEIÇÃO ORDINÁRIA" ...
 $ NR_TURNO               : num [1:251] 1 1 1 1 1 1 1 1 1 1 ...
 $ CD_ELEICAO             : num [1:251] 297 297 297 297 297 297 297 297 297 297 ...
 $ DS_ELEICAO             : chr [1:251] "Eleições Gerais Estaduais 2018" "Eleições Gerais Estaduais 2018" "Eleições Gerais Estaduais 2018" "Eleições Gerais Estaduais 2018" ...
 $ DT_ELEICAO             : chr [1:251] "07/10/2018" "07/10/2018" "07/10/2018" "07/10/2018" ...
 $ SG_UF                  : chr [1:251] "DF" "DF" "DF" "DF" ...
 $ SG_UE                  : chr [1:251] "DF" "DF" "DF" "DF" ...
 $ NM_UE                  : chr [1:251] "DISTRITO FEDERAL" "DISTRITO FEDERAL" "DISTRITO FEDERAL" "DISTRITO FEDERAL" ...
 $ CD_CARGO               : num [1:251] 8 5 5 10 8 4 5 4 9 5 ...
 $ DS_CARGO               : chr [1:251] "DEPUTADO DISTRITAL" "SENADOR" "SENADOR" "2º SUPLENTE" ...
 $ TP_AGREMIACAO          : chr [1:251] "COLIGAÇÃO" "COLIGAÇÃO" "COLIGAÇÃO" "COLIGAÇÃO" ...
 $ NR_PARTIDO             : num [1:251] 21 90 54 70 28 36 77 28 14 23 ...
 $ SG_PARTIDO             : chr [1:251] "PCB" "PROS" "PPL" "AVANTE" ...
 $ NM_PARTIDO             : chr [1:251] "PARTIDO COMUNISTA BRASILEIRO" "PARTIDO REPUBLICANO DA ORDEM SOCIAL" "PARTIDO PÁTRIA LIVRE" "AVANTE" ...
 $ SQ_COLIGACAO           : num [1:251] 7e+10 7e+10 7e+10 7e+10 7e+10 ...
 $ NM_COLIGACAO           : chr [1:251] "ELAS POR NÓS: SEM MEDO DE MUDAR O DF" "JUNTOS DE VOCÊ" "PRA FAZER A DIFERENÇA" "PRA FAZER A DIFERENÇA" ...
 $ DS_COMPOSICAO_COLIGACAO: chr [1:251] "PSOL / PCB" "PROS / PTB / PHS / PATRIOTA / PMN / PTC / PMB" "MDB / PP / AVANTE / PSL / PPL" "MDB / PP / AVANTE / PSL / PPL" ...
 $ CD_SITUACAO_LEGENDA    : chr [1:251] "D" "D" "D" "D" ...
 $ DS_SITUACAO            : chr [1:251] "DEFERIDO" "DEFERIDO" "DEFERIDO" "DEFERIDO" ...
 - attr(*, ".internal.selfref")=<externalptr> 

Visualizando a base - head()

  • Finalmente, a função head() e tail()
  • A primeira função apresenta os primeiros valores de uma base de dados
head(leg_df_2018,2)
# A tibble: 2 × 23
  DT_GERACAO HH_GERACAO ANO_ELEICAO CD_TIPO_ELEICAO NM_TIPO_ELEICAO   NR_TURNO
  <chr>      <time>           <dbl>           <dbl> <chr>                <dbl>
1 03/03/2024 11:01:19          2018               2 ELEIÇÃO ORDINÁRIA        1
2 03/03/2024 11:01:19          2018               2 ELEIÇÃO ORDINÁRIA        1
# ℹ 17 more variables: CD_ELEICAO <dbl>, DS_ELEICAO <chr>, DT_ELEICAO <chr>,
#   SG_UF <chr>, SG_UE <chr>, NM_UE <chr>, CD_CARGO <dbl>, DS_CARGO <chr>,
#   TP_AGREMIACAO <chr>, NR_PARTIDO <dbl>, SG_PARTIDO <chr>, NM_PARTIDO <chr>,
#   SQ_COLIGACAO <dbl>, NM_COLIGACAO <chr>, DS_COMPOSICAO_COLIGACAO <chr>,
#   CD_SITUACAO_LEGENDA <chr>, DS_SITUACAO <chr>
  • O segundo argumento serve para indicar quantas linhas serão apresentadas

Visualizando a base - head()

  • Tail(), por outro lado, apresenta os últimos valores de uma base de dados
tail(leg_df_2018,2)
# A tibble: 2 × 23
  DT_GERACAO HH_GERACAO ANO_ELEICAO CD_TIPO_ELEICAO NM_TIPO_ELEICAO   NR_TURNO
  <chr>      <time>           <dbl>           <dbl> <chr>                <dbl>
1 03/03/2024 11:01:19          2018               2 ELEIÇÃO ORDINÁRIA        1
2 03/03/2024 11:01:19          2018               2 ELEIÇÃO ORDINÁRIA        1
# ℹ 17 more variables: CD_ELEICAO <dbl>, DS_ELEICAO <chr>, DT_ELEICAO <chr>,
#   SG_UF <chr>, SG_UE <chr>, NM_UE <chr>, CD_CARGO <dbl>, DS_CARGO <chr>,
#   TP_AGREMIACAO <chr>, NR_PARTIDO <dbl>, SG_PARTIDO <chr>, NM_PARTIDO <chr>,
#   SQ_COLIGACAO <dbl>, NM_COLIGACAO <chr>, DS_COMPOSICAO_COLIGACAO <chr>,
#   CD_SITUACAO_LEGENDA <chr>, DS_SITUACAO <chr>